from rest_framework import serializers


# serializer不是只能为数据库模型类定义，也可以为非数据库模型类的数据定义。
class HeroInfoSerializers(serializers.Serializer):
    """英雄数据序列化器"""
    """反序列化可以把选项参数设置出来，比如：max_length=20， 可以达到验证的效果"""
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    id = serializers.IntegerField(label='ID', read_only=True)
    hname = serializers.CharField(label='名字', max_length=20)
    hgender = serializers.ChoiceField(choices=GENDER_CHOICES, label='性别', required=False)
    hcomment = serializers.CharField(label='描述信息', max_length=200, required=False, allow_null=True)


class BookInfoSerializers(serializers.Serializer):
    """创建一个图书数据序列化器"""
    id = serializers.IntegerField(label='ID', read_only=True)
    btitle = serializers.CharField(label='名称', max_length=20)
    bpub_date = serializers.DateField(label='发布日期', required=False)  # 字段可以不用传递，require： false
    bread = serializers.IntegerField(label='阅读量', required=False)
    bcomment = serializers.IntegerField(label='评论量', required=False)
    image = serializers.ImageField(label='图片', required=False)
    # # 返回关联的英雄id （一对多）
    # heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
    # # 返回关联的英雄名字
    # read_only
    # 参数的值true
    # 表示不参与反序列化验证，只参与序列化返回
    # write_only 只参与反序列化，不返回前端
    # heroinfo_set = serializers.StringRelatedField(read_only=True, many=True)
    # 使用关联嵌套查询关联字段
    heroinfo_set = HeroInfoSerializers(many=True)

    # 自定义反序列化字段验证方法
    # 自定义单一验证
    def validate_btitle(self,value):
        if value=='python':
            raise serializers.ValidationError('书名不可以python')
        return value

    # 自定义多个字段验证
    def validate(self, attrs):
        if attrs['bread'] > attrs['bcomment']:
            raise serializers.ValidationError('阅读量大于评论量')
        return attrs

